package com.test;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

public class MyPageProcessor implements PageProcessor {

    // 解析 和获取数据
    public void process(Page page) {
        System.out.println("URL:" + page.getUrl());
        if (page.getUrl().regex("https://voice\\.hupu\\.com/nba/\\d+\\.html").match()){ // 判断是否是详情页
            // 详情页
            // page.putField("title",page.getHtml().xpath("/html/body/div[4]/div[1]/div[1]/h1/text()"));
            page.putField("title",page.getHtml().css("div.artical-title h1").xpath("/h1/html()"));  // CSS 选择器

            // page.putField("img",page.getHtml().css("div.artical-importantPic img").xpath("/img/@src"));
            page.putField("img",page.getHtml().css("div.artical-importantPic img").$("img","src"));
        }else {
            // 列表
            page.addTargetRequests(

                    // page.getHtml().css("div.news-list ul li a").all()
                    // page.getHtml().xpath("/html/body/div[3]/div[1]/div[2]/ul/li/div[1]/h4/a/@href").all() //xpath 选择器
                    page.getHtml().css("div.news-list ul li h4 a").$("a","href").all()
            );

            // 翻页:
            page.addTargetRequests(
                    page.getHtml().$("div.voice-paging .page-btn-prev").$("a","href").all()
                    // page.getHtml().xpath("/html/body/div[3]/div[1]/div[3]/a[@class='page-btn-prev']/@href").all()
            );
        }
    }

    Site site = Site.me()
            .setRetryTimes(2) // 如果失败,重试2次.
            .setSleepTime(300); // 爬取时,间隔时间.

    public Site getSite() {
        return site;
    }

    //主程序
    public static void main(String[] args) {
        Spider.create(new MyPageProcessor())
                .addUrl("https://voice.hupu.com/nba") //设置起始页面
                .addPipeline(new ConsolePipeline()) // 设置输出到控制台
                // .addPipeline(new MyPipline()) // 设置输出到控制台
                .thread(4) // 启动4个线程一起抓取
                .run(); // 启动爬虫
    }

}
